掌握 ALTER TABLE 的六大武器、DROP TABLE 的安全删除,以及 DESC / SHOW CREATE TABLE 的结构查看
ALTER TABLE 有 6 种常用操作,每种对应一个关键字:
给表增加新字段或新的完整性约束。可以用 FIRST、AFTER 指定位置。
把整张表的名字改掉。结构和数据完全不变。
同时修改字段名和数据类型。即使不改类型,也必须写上数据类型。
修改字段的数据类型,或用 FIRST / AFTER 调整字段排列顺序。
切换 InnoDB ↔ MyISAM 等。注意有外键的表不能改为 MyISAM。
删除已有的字段或完整性约束。删除字段会同时删除该列所有数据。
示例1:在学生表 s 中增加一个字段"班号"class_no
示例2:同时增加多个字段——班号和住址
示例3:给已有字段增加 NOT NULL 约束(语法不同!)
示例1:修改数据类型——把 sn 从 VARCHAR(45) 改为 CHAR(30)
示例2:调整字段顺序——把 sn 移到第一位
CHANGE vs MODIFY 对比
| 对比项 | CHANGE | MODIFY |
|---|---|---|
| 能改字段名? | ✅ 可以 | ❌ 不行 |
| 能改数据类型? | ✅ 可以 | ✅ 可以 |
| 能调字段顺序? | ❌ 不行 | ✅ FIRST / AFTER |
| 一句话记忆 | 改名字用我 | 改类型、调顺序用我 |
删除字段:
删除约束:
DROP,用逗号隔开。
DROP CONSTRAINT s_chk,这个 s_chk 是怎么来的?我怎么知道约束叫什么名字?情况一:建表时用 CONSTRAINT 自己起名
CONSTRAINT 约束名 写在约束关键字前面。这样以后删约束就直接用这个名字,非常方便。建议养成命名习惯!
情况二:没起名?用 SHOW CREATE TABLE 查出来
如果建表时偷懒没写 CONSTRAINT,MySQL 会自动生成一个名字。用这条命令就能查到:
sc_check_chk_1 了吗?这就是 MySQL 自动生成的约束名。删约束时用它!
第二步:用查到的名字删除约束
完整流程:三步走
各类约束的删除语法
| 约束类型 | 删除语法 | 示例 |
|---|---|---|
CHECK |
DROP CONSTRAINT 约束名 |
DROP CONSTRAINT sc_check_chk_1 |
FOREIGN KEY |
DROP FOREIGN KEY 约束名 |
DROP FOREIGN KEY fk_sc_sno |
UNIQUE |
DROP INDEX 索引名 |
DROP INDEX sn |
PRIMARY KEY |
DROP PRIMARY KEY |
不需要名字(一张表只有一个主键) |
ALTER TABLE 六大操作速查表
| 操作 | 关键字 | 一句话说明 | 示例 |
|---|---|---|---|
| 增加字段 | ADD |
加新列到表中 | ADD class_no VARCHAR(6) |
| 改表名 | RENAME |
换个名字,数据不变 | RENAME student |
| 改字段名 | CHANGE |
改名 + 改类型 | CHANGE sn sname VARCHAR(45) |
| 改字段类型/顺序 | MODIFY |
改类型或移位 | MODIFY sn CHAR(30) FIRST |
| 换引擎 | ENGINE |
切换存储引擎 | ENGINE=MyISAM |
| 删字段/约束 | DROP |
移除列或约束 | DROP class_no |
IF EXISTS 可以避免删除不存在的表时报错——是一种"安全写法"。
三种"删除"的区别——初学者最容易搞混!
| 操作 | 删什么? | 表还在吗? | 能回滚吗? | 生活类比 |
|---|---|---|---|---|
DROP TABLE |
结构 + 数据 + 索引,全部删除 | ❌ 表消失了 | ❌ 不可回滚 | 拆房子 |
DELETE FROM |
只删数据(可加 WHERE 条件) | ✅ 表结构保留 | ✅ 可回滚 | 搬走家具 |
TRUNCATE TABLE |
清空所有数据(不可加条件) | ✅ 表结构保留 | ❌ 不可回滚 | 一键清空房间 |
列出当前数据库中所有已创建的表。
查看表的每个字段的名称、类型、是否允许 NULL、键、默认值等信息。
输出字段含义:
| 字段 | 含义 | 常见值 |
|---|---|---|
| Field | 字段名 | sno, sn, age ... |
| Type | 数据类型 | char(10), int, varchar(45) ... |
| Null | 是否允许 NULL | YES / NO |
| Key | 键/索引 | PRI(主键)、UNI(唯一)、MUL(外键/非唯一索引) |
| Default | 默认值 | NULL、'男' 等 |
| Extra | 额外信息 | auto_increment 等 |
查看创建这张表时的完整 SQL 语句,包括约束、引擎、字符集等全部细节。这在需要复制/备份表结构时特别有用。
DESC 适合快速查看字段信息;SHOW CREATE TABLE 适合完整复原建表语句。
SHOW CREATE TABLE 的输出,稍作修改(如换个表名),就能快速建一张结构相同的新表。
想查看表里存的数据,用 SELECT 语句。最简单的写法是查看所有数据:
SELECT * 即可。
三条查看命令速查表
| 命令 | 看什么? | 用途 |
|---|---|---|
SHOW TABLES |
当前数据库中有哪些表 | 确认表是否已创建 |
DESC 表名 |
表的字段名、类型、约束 | 快速了解表结构 |
SHOW CREATE TABLE 表名 |
完整的建表语句 | 复制/备份表结构 |
数据表的"一生"——从创建到删除的完整生命周期
全部命令速查:遇到问题 → 查这张表
| 分类 | 我想做什么? | 用哪条命令 | 示例 |
|---|---|---|---|
| 创建 | 新建一张表 | CREATE TABLE |
CREATE TABLE s (...) |
| 给字段加约束 | CONSTRAINT ... CHECK / FOREIGN KEY |
CONSTRAINT chk CHECK(age>0) |
|
| 修改 | 加新字段 | ALTER TABLE ... ADD |
ADD phone VARCHAR(20) |
| 改表名 | ALTER TABLE ... RENAME |
RENAME student |
|
| 改字段名 | ALTER TABLE ... CHANGE |
CHANGE sn sname VARCHAR(45) |
|
| 改字段类型 / 调顺序 | ALTER TABLE ... MODIFY |
MODIFY sn CHAR(30) FIRST |
|
| 换存储引擎 | ALTER TABLE ... ENGINE= |
ENGINE=MyISAM |
|
| 删字段 / 删约束 | ALTER TABLE ... DROP |
DROP class_no |
|
| 查看 | 看有哪些表 | SHOW TABLES |
SHOW TABLES; |
| 看表的字段信息 | DESC 表名 |
DESC s; |
|
| 看完整建表语句 | SHOW CREATE TABLE 表名 |
SHOW CREATE TABLE s; |
|
| 删除 | 删除整张表 | DROP TABLE [IF EXISTS] |
DROP TABLE IF EXISTS s; |
| 清空表中所有数据 | TRUNCATE TABLE |
TRUNCATE TABLE s; |
|
| 删除部分数据 | DELETE FROM ... WHERE |
DELETE FROM s WHERE sno='s1'; |
容易混淆的命令对比
| 对比组 | 命令 A | 命令 B | 核心区别 |
|---|---|---|---|
| 改名 vs 改类型 | CHANGE |
MODIFY |
CHANGE 能改字段名,MODIFY 能调字段顺序 |
| 拆房 vs 搬家具 vs 清空 | DROP TABLE |
DELETE / TRUNCATE |
DROP 删表+数据;DELETE 只删数据可回滚;TRUNCATE 清空不可回滚 |
| 快速看 vs 完整看 | DESC |
SHOW CREATE TABLE |
DESC 看字段列表;SHOW CREATE TABLE 看完整建表语句 |
| 改表名 vs 改字段名 | RENAME |
CHANGE |
RENAME 改表名(整张表);CHANGE 改字段名(某一列) |